package com.qhy.rabbitmq.service.impl;

import com.qhy.rabbitmq.service.ReceiveService;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author qiuhongyu
 * @date 2021/2/23 16:52
 */
@Service("receiveService")
public class ReceiveServiceImpl implements ReceiveService {

    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 这里的这个接收不是不间断的接收消息，每执行一次这个方法只能接收一次消息，如果有新消息进入则不会自动接收消息
     * 上面的话意思即：生产者发送一次消息，接收者启动消费完了消息，此时再次启动发送者发送消息，此时接收者是接收不到消息的
     * 所以不建议使用
     */
    @Override
    public void receive() {
//        String message = (String) amqpTemplate.receiveAndConvert("bootDirectQueue");
//        System.out.println("接收到的消息为：" + message);

    }

    /**
     * @RabbitListener 注解用于标记当前方法是一个RabbitMQ的消息监听方法，作用是持续性的自动接收消息
     * 这个方法不需要手动调用，Spring会自动运行这个监听
     * 属性
     *      queues 用于指定一个已经存在的队列名，用于进行队列的监听
     * @param message 接收到的具体的消息数据
     * 一个监听器可以同时监听多个队列
     *
     *  注意：如果当前监听方法正常结束Spring就会自动确认消息，如果出现异常则不会确认消息
     *                因此在消息处理时要做好消息的防止重复处理工作
     */
    @Override
    @RabbitListener(queues = {"bootDirectQueue"})
    public void directReceive(String message) {
        System.out.println("监听到的消息为：" + message);
//        System.out.println(10/0);

    }
}
